
#ifndef COMMAND_H_
#define COMMAND_H_

/* Prototipo de funciones */
typedef int (*commandFn)(int cantParam, char **param);

typedef struct commandCDT * commandADT;

/**
 *  Funcion: NewCommand
 *  Uso: command = NewCommand();
 * -----------------------------
 * Crea una nueva instancia de comandos.
 *
 */
commandADT NewCommand(void);

/**
 *  Funcion: InsertCommand
 *  Uso: InsertCommand(command, "InsertAll", InsertAll_w);
 * -------------------------------------------------------
 * Inserta un nuevo comando.
 *
 */
int InsertCommand(commandADT command, char *nameCommand, commandFn fn, int cantTok, int cantTokParam, int cantTokOpt);

/**
 *  Funcion: SetBeginCommand
 *  Uso: SetBeginCommand(command);
 * -----------------------------------------------
 * Inicializa el iterador de la tabla de comandos.
 * Invocar antes de utilizar GetNextCommand.
 */
void SetBeginCommand(commandADT command);

/**
 *  Funcion: GetNextCommand
 *  Uso: GetNextCommand(command, &NombreComando, &cantTokCommand, &cantTokParam, &fn);
 * ------------------------------------------------------------------------------------
 * Devuelve los datos del proximo comando de la tabla. De no existir mas comandos
 * retorn 0. Caso contraio retorna 1.
 *
 */
int GetNextCommand(commandADT command, char **name, int *cantTokCommand, int *cantTokParam, int * cantTokOpt, commandFn *fn);

/**
 *  Funcion: parseCommand
 *  Uso: parseCommand(UserLine);
 * ---------------------------------------------------------------------------
 * Apartir de un comando ingresado por el usuario (commandLine), se encarga
 * de determinar si es un comando valido o no. En caso de no serlo retorna 0.
 * Si fuese valido dispara automaticamente la funcion destinada al comando y
 * retorna 1. Si hay error de memoria retorna -1.
 *
 */
int parseCommand(commandADT command, char *commandLine);

/**
 *  Funcion: DeleteCommand
 *  Uso: DeleteCommand(command, "InsertAll");
 * -------------------------------------------------------
 * Elimina un comando.
 *
 */
int DeleteCommand(commandADT command, char *nameCommand);

/**
 *  Funcion: FreeCommand
 *  Uso: FreeCommand(command);
 * -------------------------------------------------------
 * Libera la instancia.
 *
 */
void FreeCommand(commandADT command);

#endif	/* COMMAND_H_ */
